import 'package:dk_flutter_base/dk_core.dart';
import 'package:dk_flutter_base/dk_ui.dart';

class DkAppBar extends ModifyAppBar {
  /*actions → List
    一个 Widget 列表，代表 Toolbar 中所显示的菜单，对于常用的菜单，通常使用 IconButton 来表示；对于不常用的菜单通常使用PopupMenuButton 来显示为三个点，点击后弹出二级菜单。

    automaticallyImplyLeading → bool
    是否提供控件占位。

    backgroundColor → Color
    Appbar 的颜色，默认值为 ThemeData.primaryColor。该值通常和下面的三个属性一起使用：
    brightness：App bar 的亮度，有白色和黑色两种主题，默认值为ThemeData.primaryColorBrightness
    iconTheme：App bar 上图标的颜色、透明度、和尺寸信息。默认值为 ThemeData.primaryIconTheme
    textTheme：App bar 上的文字样式。默认值为 ThemeData.primaryTextTheme

    bottom → PreferredSizeWidget
    一个 AppBarBottomWidget 对象，通常是 TabBar。用来在 Toolbar 标题下面显示一个 Tab 导航栏

    bottomOpacity → double
    应用栏底部的不透明程度。值1.0完全不透明，值0.0完全透明。
    通常，此值不会更改其默认值（1.0）。 当滚动应用栏时，SliverAppBar使用它来设置工具栏的不透明度动画。

    centerTitle → bool
    标题是否居中

    elevation → double
    放置此应用栏的z坐标。 这可以控制应用栏下方阴影的大小。
    默认为4，应用栏的适当高程。

    flexibleSpace → Widget
    一个显示在 AppBar 下方的控件，高度和 AppBar 高度一样，可以实现一些特殊的效果，该属性通常在 SliverAppBar 中使用

    leading → Widget
    在标题前面显示的一个控件，在首页通常显示应用的 logo；在其他界面通常显示为返回按钮

    preferredSize → Size
    Scaffold对其高度设置

    primary → bool
    此应用栏是否显示在屏幕顶部。
    如果为true，则appbar的工具栏元素和底部窗口小部件将在系统状态栏的高度上填充。 flexibleSpace的布局不受主要属性的影响。

    title → Widget
    当前界面的标题内容。

    titleSpacing → double
    标题间距，如果希望title占用所有可用空间，请将此值设置为0.0。
    默认为NavigationToolbar.kMiddleSpacing。

    toolbarOpacity → double
    应用栏的工具栏部分透明度。
    值1.0完全不透明，值0.0完全透明。*/
  DkAppBar(DKAppBarParams param)
      : super(
          key: param?.key,
          leading: param?.leading,
          title: param?.title ?? Text(param?.titleContent),
          actions: param?.actions,
          centerTitle: param?.centerTitle,
          backgroundColor: param?.backgroundColor,
          iconTheme: param?.iconTheme,
          textTheme: param?.textTheme,
          automaticallyImplyLeading: param?.automaticallyImplyLeading,
          primary: param?.primary,
          elevation: param?.elevation,
          titleSpacing: param?.titleSpacing,
          toolbarOpacity: param?.toolbarOpacity,
          bottomOpacity: param?.bottomOpacity,
          flexibleSpace: param?.flexibleSpace,
          bottom: param?.bottom,
          brightness: param?.brightness,
        );
}

class DKAppBarParams {
  BuildContext context;
  Key key;
  Widget leading;
  Widget title;
  String titleContent = "";
  bool centerTitle;
  List<Widget> actions;
  Color backgroundColor;
  IconThemeData iconTheme;
  TextTheme textTheme;
  bool automaticallyImplyLeading;
  bool primary = true;
  double elevation;
  double titleSpacing;
  double toolbarOpacity;
  double bottomOpacity;
  Widget flexibleSpace;
  PreferredSizeWidget bottom;
  Brightness brightness;
  String backArrowPath;

  DKAppBarParams({
    this.context,
    this.key,
    this.leading,
    this.title,
    this.titleContent,
    this.actions,
    this.centerTitle,
    this.backgroundColor,
    this.iconTheme,
    this.textTheme,
    this.automaticallyImplyLeading,
    this.primary,
    this.elevation,
    this.titleSpacing,
    this.toolbarOpacity,
    this.bottomOpacity,
    this.flexibleSpace,
    this.bottom,
    this.brightness,
  }) {
    checkParam();
  }

  DKAppBarParams.withBackMenu(
    this.context,
    this.actions, {
    this.backArrowPath,
    this.key,
    this.leading,
    this.title,
    this.titleContent,
    this.backgroundColor,
    this.centerTitle,
    this.iconTheme,
    this.textTheme,
    this.elevation,
    this.brightness,
  }) {
    leading ??= GestureDetector(
        onTap: () async => RouteUtil.popOrCloseCurPage(context: context),
        child: Image.asset(backArrowPath ??
            Env?.value?.dkAppBarGlobalParams?.backArrowPath ??
            ""));
    checkParam();
  }

  DKAppBarParams.withBackNoMenu(
    this.context, {
    this.backArrowPath,
    this.key,
    this.leading,
    this.title,
    this.titleContent,
    this.backgroundColor,
    this.centerTitle,
    this.iconTheme,
    this.textTheme,
    this.elevation,
    this.brightness,
  }) {
    leading ??= GestureDetector(
        onTap: () async => RouteUtil.popOrCloseCurPage(context: context),
        child: Image.asset(backArrowPath ??
            Env?.value?.dkAppBarGlobalParams?.backArrowPath ??
            ""));

    checkParam();
  }

  DKAppBarParams.noBackNoMenu({
    this.key,
    this.title,
    this.titleContent,
    this.backgroundColor,
    this.centerTitle,
    this.iconTheme,
    this.textTheme,
    this.elevation,
    this.brightness,
  }) {
    checkParam();
  }

  DKAppBarParams.withMenuNoBack(
    this.actions, {
    this.key,
    this.title,
    this.titleContent,
    this.backgroundColor,
    this.centerTitle,
    this.iconTheme,
    this.textTheme,
    this.elevation,
    this.brightness,
  }) {
    checkParam();
  }

  void checkParam() {
    if (null == title && stringBlank(titleContent)) {
      titleContent = "";
    }
    centerTitle ??= true;
    backgroundColor ??= Colors.white;
    automaticallyImplyLeading ??= true;
    titleSpacing ??= NavigationToolbar.kMiddleSpacing;
    toolbarOpacity ??= 1.0;
    bottomOpacity ??= 1.0;
    primary ??= true;
  }
}

class DkAppBarGlobalParams {
  String backArrowPath;

  DkAppBarGlobalParams.createDefault({this.backArrowPath});
}
